<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:doc="livcos.org/ns/doc"
  xmlns:m="livcos.org/ns/map"
  xmlns:f="livcos.org/ns/xslt/function"
  exclude-result-prefixes="f m doc">
  
  <xsl:import href="../../style/base.xsl"/>
  
  <xsl:output method="text"/>

  <xsl:param name="ref"/>
  
  <xsl:template match="/">
    <xsl:variable name="data">
      <xsl:variable name="uri" select="f:cosmos-uri($ref, .)"/>
      <xsl:variable name="map" select="document($uri/obj)/*"/>
      <xsl:apply-templates select="if ($uri/id) then $map/*[@id = $uri/id] else $map/*[1]" mode="prep">
        <xsl:with-param name="level" select="0"/>
      </xsl:apply-templates>
    </xsl:variable>
    <xsl:apply-templates select="$data/*"/>
  </xsl:template>
  
  <xsl:template match="@* | node()" mode="prep">
    <xsl:param name="level"/>
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="#current">
        <xsl:with-param name="level" select="$level"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="@id" mode="prep">
    <xsl:attribute name="id">
      <xsl:value-of select="f:object-id(..)"/>
      <xsl:text>#</xsl:text>
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>
  
  <xsl:template match="m:item" mode="prep">
    <xsl:param name="level"/>
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="#current">
        <xsl:with-param name="level" select="$level"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="m:rel" mode="prep">
    <xsl:param name="level"/>
    <xsl:if test="$level &lt; 2">
      <xsl:copy>
        <xsl:apply-templates select="@*" mode="#current"/>
        <xsl:if test="normalize-space(.) != ''">
          <comment xmlns="livcos.org/ns/map">
            <xsl:value-of select="."/>
          </comment>
        </xsl:if>
        <xsl:variable name="uri" select="f:cosmos-uri(@ref, .)"/>
        <xsl:choose>
          <xsl:when test="doc-available($uri/obj)">
            <xsl:variable name="item" select="document($uri/obj)/*/*/*[@id = $uri/id]"/>
            <xsl:choose>
              <xsl:when test="$item">
                <xsl:apply-templates select="$item" mode="#current">
                  <xsl:with-param name="level" select="$level + 1"/>
                </xsl:apply-templates>
              </xsl:when>
              <xsl:otherwise>
                <item xmlns="livcos.org/ns/map" missing="item">
                  <label>!! Item not available !!</label>
                </item>
                <comment xmlns="livcos.org/ns/map">
                  <xsl:text>Item '</xsl:text>
                  <xsl:value-of select="$uri/obj"/>#<xsl:value-of select="$uri/id"/>
                  <xsl:text>' is not available!</xsl:text>
                </comment>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:when>
          <xsl:otherwise>
            <item xmlns="livcos.org/ns/map" missing="map">
              <label>!! Map not available !!</label>
            </item>
            <comment xmlns="livcos.org/ns/map">
              <xsl:text>Map for item '</xsl:text>
              <xsl:value-of select="$uri/obj"/>#<xsl:value-of select="$uri/id"/>
              <xsl:text>' is not available!</xsl:text>
            </comment>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:copy>
    </xsl:if>
  </xsl:template>
  
  <xsl:template match="m:item">
    <xsl:text>{</xsl:text>
    <xsl:text>id:'</xsl:text>
    <xsl:value-of select="@id"/>
    <xsl:text>',label:'</xsl:text>
    <xsl:value-of select="m:label"/>
    <xsl:apply-templates select="m:note[normalize-space(.) != '']"/>
    <xsl:apply-templates select="m:link[normalize-space(.) != '']"/>
    <xsl:text>'</xsl:text>
    <xsl:if test="m:rels/m:rel">
      <xsl:text>,rels:[</xsl:text>
      <xsl:apply-templates select="m:rels/m:rel">
        <xsl:sort select="m:item/m:label"/>
      </xsl:apply-templates>
      <xsl:text>]</xsl:text>
    </xsl:if>
    <xsl:text>}</xsl:text>
  </xsl:template>
  
  <xsl:template match="m:note">
    <xsl:text>',note:'</xsl:text>
    <xsl:apply-templates select="node()" mode="content"/>
  </xsl:template>
  
  <xsl:template match="m:link">
    <xsl:text>',link:'</xsl:text>
    <xsl:value-of select="replace(., '''', '\\''')"/>
  </xsl:template>
  
  <xsl:template match="m:rel">
    <xsl:if test="position() > 1">,</xsl:if>
    <xsl:text>{id:'</xsl:text>
    <xsl:value-of select="@id"/>
    <xsl:text>',g:</xsl:text>
    <xsl:value-of select="if (normalize-space(@group) != '') then @group else 0"/>
    <xsl:text>,to:</xsl:text>
    <xsl:apply-templates select="m:item"/>
    <xsl:text>}</xsl:text>
  </xsl:template>
  
  <xsl:template match="@* | node()" mode="content">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="#current"/>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="text()" mode="content" priority="1">
    <xsl:value-of select="normalize-space(replace(replace(., '''', '\\'''), '\n', ' '))"/>
  </xsl:template>
  
  <xsl:template match="doc:br" mode="content">
    <br/>
  </xsl:template>
  
</xsl:stylesheet>
